[프로그래머스] 완전탐색 > 숫자 야구

문제

숫자 야구 게임

조건

  • 질문의 수는 1 이상 100 이하의 자연수입니다.
  • baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.

방법

  • 숫자야구에서 사용할 수 있는 모든 수를 구합니다.
  • 그 안에서 주어진 질문과 답(스트라이크, 볼 개수)을 가지고 알맞지 않은 수를 제거합니다.
  • 검증하는 방법은 특정 수와 질문을 비교했을 때 질문의 답과 일치하지 않으면 알맞지 않은 수입니다.

문제풀이

from typing import List
from itertools import permutations


def solution(baseball: List[List[int]]) -> int:
    answer = list(permutations(["1", "2", "3", "4", "5", "6", "7", "8", "9"], 3))

    for q in baseball:
        if q[1] == 3:
            """스트라이크가 3개면 예상 가능한 답은 1개"""
            return 1

        str_ = str(q[0])

        for a in answer[:]:
            S = 0

            for i in range(3):
                """자리가 같으면 스트라이크"""
                if str_[i] == a[i]:
                    S += 1

            """동일한 숫자의 개수에서 스트라이크 개수를 빼면 볼 개수"""
            B = len(set(str_).intersection(a)) - S

            if S != q[1] or B != q[2]:
                """스트라이크와 볼 개수가 다르면 알마지 않은 수이므로 제거"""
                answer.remove(a)
    return len(answer)

테스트 코드

import unittest

from .solution import solution


class TestCase(unittest.TestCase):
    def test_case_1(self) -> None:
        self.assertEqual(
            solution([[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]]), 2
        )

어려웠던 점

  • 주어진 숫자들로 가능한 숫자를 찾으려고 하다 보니 코드도 많이 복잡해지고 어려웠는데 반대로, 모든 예상 답안을 만들어 놓고 그 안에서 답을 찾아나가니 구할 수 있었다.

Written by@EHX
Software Developer, Back-End Engineer

GitHubFacebook